﻿/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#ifndef __122BEDCC_30F7_4F3A_8D1C_34EE6BCAE753__
#define __122BEDCC_30F7_4F3A_8D1C_34EE6BCAE753__

// DRIVER={MySQL ODBC 5.3 ANSI Driver};SERVER=192.168.80.131;PORT=3306;DATABASE=javadb;UID=root;PWD=root;CharSet=UTF8;

namespace xos_odbc
{

    /////////////////////////////////////////////////////////////////////////////////
    // 
    // 语句接口
    // 
    class i_stmt : public xos::i_release
    {
    public:
        enum enumDirection
        {
            DIRECT_INPUT_OUTPUT,
            DIRECT_OUTPUT,
            DIRECT_INPUT
        };

        enum enumValueType
        {
			VT_CHAR_ARRAY,
            VT_DOUBLE,
            VT_FLOAT,
            VT_BOOL,
            VT_BIN,
			VT_U64,
			VT_I64,
            VT_U32,
            VT_I32,
            VT_U16,
            VT_I16,
            VT_U8,
            VT_I8
        };

		enum enumLenOrPtr
		{
			LP_DEFAULT_PARAM = -5,
			LP_DATA_AT_EXEC = -2,
			LP_NULL_DATA = -1,
			LP_NTS = -3
		};

    public:
        virtual ~i_stmt(){}

    public:
		// 
		// 得到最近的错误信息
		// 
		virtual int get_last_err_info( char * lpszInfo, int nSize, int * lpnInfoLen, int * lpnLenNeeded ) = 0;

        // 
        // 绑定输入参数
        // 
        virtual int bind_param( int nCol, enumDirection eType, enumValueType eValueType, 
			enumValueType eParamType, 
			int ColSize, 
			int DecimalDigits, 
			void * ParamValuePtr, 
			int BufLen, 
			xos::xos_int * StrLen_or_IndPtr ) = 0;

		// 
		// 绑定输入参数
		// 
		virtual int bind_param( int nCol, const char * lpszData, int nNoop, xos::xos_int * StrLen_or_IndPtr ) = 0;

        // 
        // 绑定输入参数
        // 
        virtual int bind_param( int nCol, xos::xos_i64 * lpnData, xos::xos_int * StrLen_or_IndPtr ) = 0;

        // 
		// 绑定输入参数
		// 
		virtual int bind_param( int nCol, xos::xos_i32 * lpnData, xos::xos_int * StrLen_or_IndPtr ) = 0;

        // 
        // 绑定输入参数
        // 
        virtual int bind_param( int nCol, xos::xos_i16 * lpnData, xos::xos_int * StrLen_or_IndPtr ) = 0;

        // 
        // 绑定输入参数
        // 
        virtual int bind_param( int nCol, xos::xos_i8 * lpnData, xos::xos_int * StrLen_or_IndPtr ) = 0;

        // 
        // 绑定输入参数
        // 
        virtual int bind_param( int nCol, xos::xos_u64 * lpnData, xos::xos_int * StrLen_or_IndPtr ) = 0;

        // 
        // 绑定输入参数
        // 
        virtual int bind_param( int nCol, xos::xos_u32 * lpnData, xos::xos_int * StrLen_or_IndPtr ) = 0;

        // 
        // 绑定输入参数
        // 
        virtual int bind_param( int nCol, xos::xos_u16 * lpnData, xos::xos_int * StrLen_or_IndPtr ) = 0;

        // 
        // 绑定输入参数
        // 
        virtual int bind_param( int nCol, xos::xos_u8 * lpnData, xos::xos_int * StrLen_or_IndPtr ) = 0;

        // 
        // 绑定输入参数
        // 
        virtual int bind_param( int nCol, bool * lpnData, xos::xos_int * StrLen_or_IndPtr ) = 0;

		// 
		// 绑定输入参数
		// 
		virtual int bind_param( int nCol, float * lpfData, int nDigitNum, xos::xos_int * StrLen_or_IndPtr ) = 0;

        // 
        // 绑定输入参数
        // 
        virtual int bind_param( int nCol, double * lpdData, int nDigitNum, xos::xos_int * StrLen_or_IndPtr ) = 0;

		// 
		// 翻译一下odbc返回的StrLen_or_IndPtr为i_stmt中的enumLenOrPtr类型
		// 
		virtual int translate_strlen_or_indptr( xos::xos_int StrLen_or_IndPtr, xos::xos_int * lp_StrLen_or_IndPtr ) = 0;

        // 
        // 直接运行sql
        // 
        //  0 : success. 
        //  1 : running. 
        // -1 : failed
        // 
        virtual int execute_direct( const char * lpszSql ) = 0;

        //
        // 编译sql
        // 
        //  0 : success. 
        //  1 : running. 
        // -1 : failed
        // 
        virtual int prepare_sql( const char * lpszSql ) = 0;

        // 
        // 绑定输入后执行sql语句写入
        // 
        //  0 : success. 
        //  1 : running. 
        // -1 : failed
        // 
        virtual int execute() = 0;

        // 
        // 绑定输出参数
        // 
        virtual int bind_colum( int nCol, enumValueType eType, void * pBufByte, 
			int nBufSize, 
			xos::xos_int * StrLen_or_IndPtr ) = 0;

        // 
        // 绑定输出参数
        // 
        virtual int bind_colum( int nCol, char * lpData, int nBufSize, xos::xos_int * StrLen_or_IndPtr ) = 0;

        // 
        // 绑定输出参数
        // 
        virtual int bind_colum( int nCol, xos::xos_i64 * lpData, xos::xos_int * StrLen_or_IndPtr ) = 0;

        // 
        // 绑定输出参数
        // 
        virtual int bind_colum( int nCol, xos::xos_i32 * lpData, xos::xos_int * StrLen_or_IndPtr ) = 0;

        // 
        // 绑定输出参数
        // 
        virtual int bind_colum( int nCol, xos::xos_i16 * lpData, xos::xos_int * StrLen_or_IndPtr ) = 0;

        // 
        // 绑定输出参数
        // 
        virtual int bind_colum( int nCol, xos::xos_i8 * lpData, xos::xos_int * StrLen_or_IndPtr ) = 0;

        // 
        // 绑定输出参数
        // 
        virtual int bind_colum( int nCol, xos::xos_u64 * lpData, xos::xos_int * StrLen_or_IndPtr ) = 0;

        // 
        // 绑定输出参数
        // 
        virtual int bind_colum( int nCol, xos::xos_u32 * lpData, xos::xos_int * StrLen_or_IndPtr ) = 0;

        // 
        // 绑定输出参数
        // 
        virtual int bind_colum( int nCol, xos::xos_u16 * lpData, xos::xos_int * StrLen_or_IndPtr ) = 0;

        // 
        // 绑定输出参数
        // 
        virtual int bind_colum( int nCol, xos::xos_u8 * lpData, xos::xos_int * StrLen_or_IndPtr ) = 0;

        // 
        // 绑定输出参数
        // 
        virtual int bind_colum( int nCol, bool * lpData, xos::xos_int * StrLen_or_IndPtr ) = 0;

        // 
        // 绑定输出参数
        // 
        virtual int bind_colum( int nCol, float * lpData, xos::xos_int * StrLen_or_IndPtr ) = 0;

        // 
        // 绑定输出参数
        // 
        virtual int bind_colum( int nCol, double * lpData, xos::xos_int * StrLen_or_IndPtr ) = 0;

        // 
        // 设置是否异步执行sql
        // 
        virtual int set_async( bool bAsync ) = 0;
        
        // 
        // 下一结果集
        // 
        virtual int next_results() = 0;

        // 
        //  0 : success
        //  1 : pending
        //  2 : no data
        // -1 : failed
        // 
        virtual int fetch() = 0;

        // 
        // 执行DML后，影响的行数
        // 
        virtual int get_affect_row_num( long long * lpnNum ) = 0;

        // 
        // 得到结果集行数
        // 
        virtual int get_result_row_num( long long * lpnNum ) = 0;

        // 
        // 查询结果集中的列数
        // 
        virtual int get_result_col_num( int * lpnNum ) = 0;

        // 
        // 查询结果集中的列数,index从0开始
        // 
        virtual int get_col_name( int nIndex, char * lpszName, int nLen ) = 0;
    };

} // xos_odbc

#endif // __122BEDCC_30F7_4F3A_8D1C_34EE6BCAE753__
